﻿using System;
using System.Globalization;
using System.ComponentModel.Design;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Microsoft.VisualStudio.OLE.Interop;
using Microsoft.VisualStudio.Shell.Interop;
using Microsoft.VisualStudio.Shell;
using Microsoft.VsSDK.IntegrationTestLibrary;
using Microsoft.VSSDK.Tools.VsIdeTesting;

namespace VSXtraCommands_IntegrationTestProject
{
  [TestClass()]
  public class MenuItemTest
  {
    private delegate void ThreadInvoker();

    private TestContext testContextInstance;

    /// <summary>
    ///Gets or sets the test context which provides
    ///information about and functionality for the current test run.
    ///</summary>
    public TestContext TestContext
    {
      get
      {
        return testContextInstance;
      }
      set
      {
        testContextInstance = value;
      }
    }

    /// <summary>
    ///A test for lauching the command and closing the associated dialogbox
    ///</summary>
    [TestMethod()]
    [HostType("VS IDE")]
    public void LaunchCommand()
    {
      UIThreadInvoker.Invoke((ThreadInvoker)delegate()
      {
        CommandID menuItemCmd = new CommandID(DeepDiver.VSXtraCommands.GuidList.guidVSXtraCommandsCmdSet, (int)DeepDiver.VSXtraCommands.PkgCmdIDList.cmdidMyCommand);

        // Create the DialogBoxListener Thread.
        string expectedDialogBoxText = string.Format(CultureInfo.CurrentCulture, "{0}\n\nInside {1}.MenuItemCallback()", "VSXtraCommands", "DeepDiver.VSXtraCommands.VSXtraCommandsPackage");
        DialogBoxPurger purger = new DialogBoxPurger(NativeMethods.IDOK, expectedDialogBoxText);

        try
        {
          purger.Start();

          TestUtils testUtils = new TestUtils();
          testUtils.ExecuteCommand(menuItemCmd);
        }
        finally
        {
          Assert.IsTrue(purger.WaitForDialogThreadToTerminate(), "The dialog box has not shown");
        }
      });
    }

  }
}
